package javase.javase01.exercise09;

import java.util.Arrays;
import java.util.Comparator;

/**
 * @author: Gan
 * @date 2021/4/13 0013 19:29
 * @description: 编写一个Cat类
 * 成员变量：int age，String name，double price
 * 按以下要求进行自然排序：
 * 1，直接实现Comparable接口，按照年龄的从小到大对Cat数组进行自然排序
 * 2，利用Comparator接口，用 匿名内部类和lambda分别对Cat数组进行自然排序
 *   1，按照price的大到小排序
 *   2，name的长短排序，name越长对象越大
 *   3，综合age，name，price进行排序，要求用lambda表达式指向一个方法。
 * 排序的规则是age越小对象越小，age相同比较name长短，name越短对象越小，name长度也相等，比较price，price越大对象越小
 **/
public class Demo2 {
    public static void main(String[] args) {
        Cat cat1 = new Cat(2, "Tony", 98.8);
        Cat cat2 = new Cat(3, "Tom", 100.9);
        Cat cat3 = new Cat(6, "Mikey", 45.0);
        //把猫的信息装入数组当中
        Cat[] cats = {cat1, cat2, cat3};
        //按照年龄的从小到大对Cat数组进行自然排序 重写compareTo()方法
        Arrays.sort(cats);
        System.out.println(Arrays.toString(cats));
        //用匿名内部类对Cat数组进行自然排序(按照价格大到小)
        Arrays.sort(cats, new Comparator<Cat>() {
            @Override
            public int compare(Cat o1, Cat o2) {
                return ((int) (o2.price - o1.price));
            }
        });
        System.out.println(Arrays.toString(cats));
        //name的长短排序，name越长对象越大
        Arrays.sort(cats, new Comparator<Cat>() {
            @Override
            public int compare(Cat o1, Cat o2) {
                return o1.name.length() - o2.name.length();
            }
        });
        System.out.println(Arrays.toString(cats));
        //综合age，name，price进行排序 用lambda表达式
        Arrays.sort(cats,Demo2::myCompare);
        System.out.println(Arrays.toString(cats));

    }
    private static int myCompare(Object object1, Object object2){
        Cat o1 = (Cat) object1;
        Cat o2 = (Cat) object2;
        if (o1.age != o2.age) return o1.age - o2.age;
        if (o1.name.length() != o2.name.length())
            return o1.name.length() - o2.name.length();
        return ((int) (o2.price - o1.price));
    }
}

class Cat implements Comparable {
    int age;
    String name;
    double price;

    public Cat(int age, String name, double price) {
        this.age = age;
        this.name = name;
        this.price = price;
    }

    @Override
    public int compareTo(Object o) {
        Cat cat = (Cat) o;
        return this.age - cat.age;
    }

    @Override
    public String toString() {
        return "{" +
                "age=" + age +
                ", name='" + name + '\'' +
                ", price=" + price +
                '}';
    }
}